﻿using ProjectManager.Logic.Content;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProjectManager.Interface
{
    /// <summary>
    /// 核心逻辑
    /// 用异常来处理错误
    /// 用多线程来处理耗时操作，如果需要等待的话，进入等待界面，用回调函数来处理结果
    /// </summary>
    internal interface ILogic
    {
        ProjectInformation CurrentProject { get; set; }
        MemberInformation CurrentIdentity { get; set; }
        void InitUserAction(Action<string> ShowWait, Action EndWait, Action<string> ShowErrorMessage);
        // 主管创建项目
        void CreateProject(string url, string selfName, string gitAccount, string password);
        // 成员加入项目
        void JoinProject(string url, string selfName, string gitAccount, string password);
        // 创建团队，自己是主管，第二个参数是否是个人团队
        void CreateTeam(string teamName, bool IsIndivual = false);
        // 团队加人/子团队(需要验证自己是rootTeam团队的主管)
        void TeamAddMember(TeamInformation rootTeam, TeamInformation addedMember);
        // 团队移除成员/子团队(需要验证自己是rootTeam团队的主管)
        void TeamRemoveMember(TeamInformation rootTeam, TeamInformation removedMember);
        // 解散团队(需要验证自己是rootTeam团队的主管)
        // 仅在团队信息中标注已解散，不删除该团队信息(IsCancelled = true)
        void DisbandTeam(TeamInformation rootTeam);
        // 团队主管发布任务
        void PublishTask(ProjectTaskInformation rootTask, 
            TeamInformation teamInformation,
            DateTime StartDate, DateTime EndDate,
            string taskName, string taskDescription,
            List<string> protectedPaths);
        // 成员提交任务(需检查子任务是否有还没做完的或者待审核的或者暂停的),任务进入待审核状态
        void SubmitTask(ProjectTaskInformation rootTask,
            string submitTitle, string submitDescription);
        // 主管修改任务
        void UpdateTask(ProjectTaskInformation rootTask,
            TeamInformation teamInformation,
            DateTime StartDate, DateTime EndDate,
            string taskName, string taskDescription,
            List<string> protectedPaths,
            ProjectTaskStatus taskStatus);
        // 主管审核任务
        // 第一步：在新的路径存放任务开始前文件和任务开始后文件，用于在本地查看器打开对比
        void AuditTaskStart(ProjectTaskInformation rootTask, out List<string> beforePath, out List<string> completePath);
        // 第二步：用户输入是否通过审核，如果通过则合并入父任务分支，否则将任务改为正在进行状态
        void AuditTaskFinish(ProjectTaskInformation rootTask, bool succeed, 
            string AuditTitle, string AuditDescription);
        // 获取所有团队，按
        // 1. 自己个人团队
        // 2. 自己主管的团队
        // 3. 自己加入的团队
        // 4. 其他团队
        // 排序
        List<TeamInformation> GetTeams();
        // 获取自己参与的所有任务
        List<ProjectTaskInformation> GetTasks();
        // 检查并更新(异步定时执行)
        // 1. 任务分支
        // 2. 团队信息
        // 返回消息内容
        List<string> CheckMessages(); // pull
        //GitCommitTree GetCommitTree();
        //string GetCurrentCommitID();
        //void Roll(string commitID);
        // 拉取更新（所有）
        // bool Pull();
        // void Push();
        // 废弃设计方法
        // void Commit(string commitName, string commitDescription);
        List<(ProjectInformation, MemberInformation)> GetProjectList();
    }
}
